print("-----------------10.3 异常----------------------")
# Python 使用称为异常（exception）的特殊对象来管理程序执行期间发生的错误。
# 每当发生让 Python 不知所措的错误时，它都会创建一个异常对象。
# 如果你编写了处理该异常的代码，程序将继续运行；
# 如果你未对异常进行处理，程序将停止，并显示一个 traceback，其中包含有关异常的报告。

# 异常是使用 try-except 代码块处理的。
# try-except 代码块让Python 执行指定的操作，同时告诉 Python 在发生异常时应该怎么办。
# 在使用try-except 代码块时，即便出现异常，程序也将继续运行：
# 显示你编写的友好的错误消息，而不是令用户迷惑的 traceback。

print("-----------10.3.1 处理 ZeroDivisionError 异常---------------")
# 使用 try-except 代码块, 让python执行指定的操作, 同时告诉python在发生异常时如何处理
# print(5/0)

print("-----------10.3.2 使用 try-except 代码块---------------")
try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero!")

print("-----------10.3.3 使用异常避免崩溃---------------")
# 如果在错误发生时，程序还有工作没有完成，妥善地处理错误就显得尤其重要。
# 这种情况经常出现在要求用户提供输入的程序中。
# 如果程序能够妥善地处理无效输入，就能提示用户提供有效输入，而不至于崩溃。

print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")

# while True:
#     first_number = input("\nFirst number: ")
#     if first_number == 'q':
#         break
#     second_number = input("Second number: ")
#     if second_number == 'q':
#         break
#     answer = int(first_number) / int(second_number)
#     print(answer)

print("-----------10.3.4 else 代码块---------------")
# 依赖于 try 代码块成功执行的代码都应放到 else 代码块中。
# 在 try 代码块成功执行时才需要运行的代码都可放到 else 代码块中。

# while True:
#     first_number = input("\nFirst number: ")
#     if first_number == 'q':
#         break
#     second_number = input("Second number: ")
#     if second_number == 'q':
#         break
#     try:
#         answer = int(first_number) / int(second_number)
#     except ZeroDivisionError:
#         print("You can't divide by 0!")
#     else:
#         print(answer)

print("-----------10.3.5 处理 FileNotFoundError 异常---------------")
from pathlib import Path
path = Path('alice.txt')
try:
    contents = path.read_text(encoding='utf-8')
except FileNotFoundError:
    print(f"Sorry, the file {path} does not exist.")
# 注意，这里使用 read_text() 的方式与前面稍有不同。
# 如果系统的默认编码与要读取的文件的编码不一致，参数 encoding 必不可少。

print("-----------10.3.6 分析文本---------------")
# 方法 count() 计算指定的字符串在字符串中出现了多少次。
# 下面来计算单词 'the' 在 'Alice in Wonderland' 中出现了多少次：
# title() 以首字母大写的方式显示每个单词。
# lower() 将字符串转换为小写。
# upper() 将字符串转换为大写。

from pathlib import Path
path = Path('./10_file_exception/alice.txt')
try:
    contents = path.read_text(encoding='utf-8')
    # print(contents) 
except FileNotFoundError:
    print(f"Sorry, the file {path} does not exist.")
else:
    # 计算文件中特定单词出现了多少次
    # split() 根据空格将字符串分成多个部分，并将这些部分都存储到一个列表中。
    words = contents.split()
    # print(words)
    num_words = len(words)
    print(f"The file {path} has about {num_words} words.")

print("-----------10.3.7 使用多个文件---------------")
from pathlib import Path
def count_words(path):
    """计算一个文件大致包含多少个单词"""
    try:
        contents = path.read_text(encoding='utf-8')
    except FileNotFoundError:
        print(f"Sorry, the file {path} does not exist.")
    else:
        # 计算文件中特定单词出现了多少次
        # split() 根据空格将字符串分成多个部分，并将这些部分都存储到一个列表中。
        words = contents.split()
        num_words = len(words)
        print(f"The file {path} has about {num_words} words.")

path = Path('./10_file_exception/alice.txt')
count_words(path)

print("-----------10.3.8 静默失败---------------")
# 并非每次捕获异常都需要告诉用户，有时候希望程序在发生异常时保持静默，
# 就像什么都没有发生一样继续运行。
# 要让程序静默失败，# 可像通常那样编写 try 代码块，
# 但在except 代码块中明确地告诉 Python 什么都不要做。
# Python 有一个 pass语句，可在代码块中使用它来让 Python 什么都不做
def count_words(path):
    """计算一个文件大致包含多少个单词"""
    try:
        contents = path.read_text(encoding='utf-8')
    except FileNotFoundError:
        pass
    else:
        # 计算文件中特定单词出现了多少次
        # split() 根据空格将字符串分成多个部分，并将这些部分都存储到一个列表中。
        words = contents.split()
        num_words = len(words)
        print(f"The file {path} has about {num_words} words.")

path = Path('./10_file_exception/alice.txt')
count_words(path)

# 使用方法 count() 来确认特定单词或短语在字符串中出现了多少次。
# 方法 lower() 让字符串全部为小写，再使用 count() 来计算指定的单词或短语在字符串中出现了多少次。
# 方法 title() 以首字母大写的方式显示每个单词。
# 方法 upper() 将字符串转换为大写。
line = "Row, row, row your boat"
print(line.count('row'))
print(line.lower().count('row'))
